Cairo Hintの使い方
code:hint.cairo
func foo() -> (res):
alloc_locals
local x = 5 # Note this line.
assert x * x = 25
return (res=x)
end
func bar() -> (res):
alloc_locals
local x
%{ ids.x = 5 %} # Note this line.
assert x * x = 25
return (res=x)
end
fooとbarの違いはxの値を隠している点。これがproverが秘密を隠すトリックになっている。
つまり、vrifyerからするとproverは以下のコードを実行したように見える
code:cairo
func bar() -> (res):
alloc_locals
local x
assert x * x = 25
return (res=x)
end
$ 0 * 0 != 25なので、実行はすべて失敗し、証明は生成できない。
そこで,proverはx * x = 25を満たすような値を選ばなければならない.
つまり、bar()が呼ばれたとき、vrifyerは5か-5のどちらかを返すことは知っているが、どちらを返すかは知らないし、proverはどちらの値を返すかを知っていなければならず、推測することはできない
何かしらの問題の答えは、隠す必要があるのでjsonファイルなどから読み込むようにできる
%{}%で中身を全てhint化させることができる
全てのインスタンスはidsを継承しているからids.hogeみたいにメソッド的な使用ができるの?
ここでのidxのようなパラメータは、本当に使用されたのか?size範囲内にあるのか?などの健全性を満たすことが必要で
そのようなCairoを書く努力が要る
証明者がids以外のパラメータで検証用の関数を用意しておけば良い
ヒント自体は O(N) の演算を必要としますが、これは Cairo のコードには含まれません。
ヒントとは、非決定性をどのように解決するかという、 プローバーへの指示に過ぎないことを覚えておいてください。実際には、ヒントの演算は Cairo の命令に対してずっと安い (ほとんどの場合無視できる) ものです。